﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MPR.Poker.Model.SYS;
using Library.AppWeb;
using System.Data;
using MPR.Poker.DALEntity;

namespace MPR.Poker.DALEntity.SYS
{
    /// <summary>
    /// Trần Hòa Nghĩa
    /// 29/11/2013
    /// Danh sách lỗi
    /// </summary>
    public class DAL_Error
    {
        public DAL_Error()
        {
        }

        #region Insert/Update/Delete

        public static void Insert(SYS_Error objError)
        {            
            try
            {
                using (PokerLife db = new PokerLife())
                {
                    SYS_Error error = new SYS_Error();
                    error.ErrorName = objError.ErrorName;
                    error.Description = objError.Description;
                    error.ErrorDate = DateTime.Now;
                    error.UserIDSys = objError.UserIDSys;
                    error.Type = objError.Type;
                    error.ModuleName = objError.ModuleName;

                    db.SYS_Errors.Add(error);
                    db.SaveChanges();
                }
            }
            catch
            {
                
            }            
        }

        public static void Insert(ResultMessage objResultMessage, int intUID, string strModuleName)
        {
            try
            {
                using (PokerLife db = new PokerLife())
                {
                    SYS_Error error = new SYS_Error();
                    error.ErrorName = objResultMessage.Message;
                    error.Description = objResultMessage.MessageDetail;
                    error.ErrorDate = DateTime.Now;
                    error.UserIDSys = intUID;
                    error.Type = objResultMessage.ErrorType.ToString();
                    error.ModuleName = strModuleName;

                    db.SYS_Errors.Add(error);
                    db.SaveChanges();

                }
            }
            catch
            {

            } 
        }
        #endregion

        #region Load/Search/Select

        /// <summary>
        /// Lấy thông tin lỗi
        /// </summary>
        /// <param name="objError"></param>
        /// <param name="strID"></param>
        /// <returns></returns>
        public ResultMessage LoadInfo(ref SYS_Error objError, int intIDSys)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {
                    var Error = from er in db.SYS_Errors
                                where er.IDSys == intIDSys
                                select new
                                {
                                    er.IDSys,
                                    er.ErrorName,
                                    er.Description,
                                    er.ErrorDate,
                                    er.UserIDSys,
                                    er.Type,
                                    er.ModuleName
                                };

                    objError = new SYS_Error();
                    foreach (var obj in Error)
                    {
                        if (!Convert.IsDBNull(obj.IDSys)) objError.IDSys = obj.IDSys;
                        if (!string.IsNullOrEmpty(obj.ErrorName)) objError.ErrorName = obj.ErrorName;
                        if (!string.IsNullOrEmpty(obj.Description)) objError.Description = obj.Description;
                        if (!Convert.IsDBNull(obj.ErrorDate)) objError.ErrorDate = obj.ErrorDate;
                        if (!Convert.IsDBNull(obj.UserIDSys)) objError.UserIDSys = obj.UserIDSys;
                        if (!Convert.IsDBNull(obj.Type)) objError.Type = obj.Type;
                        if (!Convert.IsDBNull(obj.ModuleName)) objError.ModuleName = obj.ModuleName;
                    }
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.LoadInfo, "Lấy thông tin lỗi", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Error --> LoadInfo");
                return objResultMessage;
            }
            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy thông tin lỗi thành công", string.Empty);
        }

        /// <summary>
        /// Lấy danh sách lỗi
        /// </summary>
        /// <param name="dtError"></param>
        /// <returns></returns>
        public ResultMessage SearchData(ref DataTable dtError)
        {
            ResultMessage objResultMessage = new ResultMessage();
            dtError = new DataTable();

            try
            {
                List<SYS_Error> lst = new List<SYS_Error>();
                objResultMessage = SelectToList(ref lst);
                if (objResultMessage.IsError) return objResultMessage;

                dtError = ConvertData.ConvertToDataTable<SYS_Error>(lst);
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SearchData, "Lấy thông tin lỗi", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Error --> SearchData");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy danh sách lỗi thành công", string.Empty);
        }

        /// <summary>
        /// Lấy danh sách lỗi
        /// </summary>
        /// <param name="dtError"></param>
        /// <param name="objpara">Loại tìm (Tất cả,tên người dùng, tên lỗi, module, diễn giải), từ ngày , đến ngày , loại</param>
        /// <returns></returns>
        public ResultMessage SearchData(ref DataTable dtError, object[] objpara)
        {
            ResultMessage objResultMessage = new ResultMessage();
            dtError = new DataTable();
            
            try
            {
                List<SYS_Error> lst=new List<SYS_Error>();
                objResultMessage = SelectToList(ref lst, objpara);
                if (objResultMessage.IsError) return objResultMessage;

                dtError = ConvertData.ConvertToDataTable<SYS_Error>(lst);
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SearchData, "Lấy thông tin lỗi", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Error --> SearchData");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy danh sách lỗi thành công", string.Empty);
        }

        /// <summary>
        /// Lấy danh sách lỗi dạng List
        /// </summary>
        /// <param name="lstError"></param>
        /// <returns></returns>
        public ResultMessage SelectToList(ref List<SYS_Error> lstError)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {
                    var Error = (from e in db.SYS_Errors
                                 orderby e.IDSys
                                 select new
                                 {
                                     e.IDSys,
                                     e.ErrorName,
                                     e.Description,
                                     e.ErrorDate,
                                     e.UserIDSys,
                                     e.Type,
                                     e.ModuleName
                                 }).ToList().Select(d => new SYS_Error()
                                 {
                                     IDSys = d.IDSys,
                                     ErrorName = d.ErrorName,
                                     Description = d.Description,
                                     ErrorDate = d.ErrorDate,
                                     UserIDSys = d.UserIDSys,
                                     Type = d.Type,
                                     ModuleName = d.ModuleName
                                 });


                    lstError = Error.ToList();
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SelectData, "Lấy danh sách lỗi", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Error --> SelectToList");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy danh sách lỗi thành công", string.Empty);
        }

        /// <summary>
        /// Lấy danh sách lỗi dạng List
        /// </summary>
        /// <param name="lstError"></param>
        /// <param name="objpara">Loại tìm (Tất cả,tên người dùng, tên lỗi, module, diễn giải), từ ngày , đến ngày , loại</param>
        /// <returns></returns>
        public ResultMessage SelectToList(ref List<SYS_Error> lstError, object[] objpara)
        {
            ResultMessage objResultMessage = new ResultMessage();
            int intType = Convert.ToInt32(objpara[0]);//Loại tìm kiếm
            string strContent= objpara[1]==null ? "": objpara[1].ToString().Trim();
            DateTime dtBegin =  (DateTime)objpara[2];
            DateTime dtEnd = (DateTime)objpara[3];
            string strType = objpara[4]==null? "" :  objpara[4].ToString();

            try
            {
                using (PokerLife db = new PokerLife())
                {
                    var Error = (from e in db.SYS_Errors
                                 where ((intType==0 & (string.IsNullOrEmpty(strContent) | (  
                                  e.ErrorName.Contains(strContent) | e.ModuleName.Contains(strContent) 
                                 | e.Description.Contains(strContent))))
                                 | (intType==1 & (string.IsNullOrEmpty(strContent) ))
                                 | (intType == 2 & (string.IsNullOrEmpty(strContent) |e.ErrorName.Contains(strContent)))
                                 | (intType == 3 & (string.IsNullOrEmpty(strContent) |e.ModuleName.Contains(strContent)))
                                 | (intType == 4 & (string.IsNullOrEmpty(strContent) |e.Description.Contains(strContent))))
                                 & e.ErrorDate >= dtBegin & e.ErrorDate <= dtEnd & e.Type.Contains(strType)

                                 orderby e.IDSys
                                 select new
                                 {
                                     e.IDSys,
                                     e.ErrorName,
                                     e.Description,
                                     e.ErrorDate,
                                     e.UserIDSys,
                                     e.Type,
                                     e.ModuleName
                                 }).ToList().Select(d => new SYS_Error()
                                 {
                                     IDSys = d.IDSys,
                                     ErrorName = d.ErrorName,
                                     Description = d.Description,
                                     ErrorDate = d.ErrorDate,
                                     UserIDSys = d.UserIDSys,
                                     Type = d.Type,
                                     ModuleName = d.ModuleName
                                 });

                    lstError = Error.ToList();
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SelectData, "Lấy danh sách lỗi", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Error --> SelectToList");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy danh sách lỗi thành công", string.Empty);
        }

        /// <summary>
        /// Lấy danh sách lỗi dạng List
        /// </summary>
        /// <param name="lstError">Đối tượng lỗi</param>
        /// <param name="intPageSize">Số lượng Record một trang</param>
        /// <param name="intPageNumber">Lấy trang số mấy</param>
        /// <returns></returns>
        public ResultMessage SelectToList(ref List<SYS_Error> lstError, int intPageSize, int intPageNumber)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {
                    var Error = from gu in db.SYS_Errors
                                orderby gu.IDSys
                                select gu;

                    lstError = Error.Skip((intPageNumber - 1) * intPageSize).Take(intPageSize).ToList();
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SelectData, "Lấy danh sách lỗi", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Error --> SelectToList");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy danh sách lỗi thành công", string.Empty);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="lstError">Đối tượng lỗi</param>
        /// <param name="intPageSize">Số lượng Record một trang</param>
        /// <param name="intPageNumber">Lấy trang số mấy</param>
        /// <param name="objpara">Loại tìm (Tất cả,tên người dùng, tên lỗi, module, diễn giải), từ ngày , đến ngày , loại</param>
        /// <returns></returns>
        public ResultMessage SelectToList(ref List<SYS_Error> lstError, int intPageSize, int intPageNumber, object[] objpara)
        {
            ResultMessage objResultMessage = new ResultMessage();
            int intType = Convert.ToInt32(objpara[0]);//Loại tìm kiếm
            string strContent = objpara[1].ToString().Trim();
            DateTime dtBegin = (DateTime)objpara[2];
            DateTime dtEnd = (DateTime)objpara[3];
            string strType = objpara[4].ToString();

            try
            {
                using (PokerLife db = new PokerLife())
                {
                    var Error = (from e in db.SYS_Errors
                                 where ((intType == 0 & (string.IsNullOrEmpty(strContent) | (
                                  e.ErrorName.Contains(strContent) | e.ModuleName.Contains(strContent)
                                 | e.Description.Contains(strContent))))
                                 | (intType == 1 & (string.IsNullOrEmpty(strContent) ))
                                 | (intType == 2 & (string.IsNullOrEmpty(strContent) | e.ErrorName.Contains(strContent)))
                                 | (intType == 3 & (string.IsNullOrEmpty(strContent) | e.ModuleName.Contains(strContent)))
                                 | (intType == 4 & (string.IsNullOrEmpty(strContent) | e.Description.Contains(strContent))))
                                 & e.ErrorDate >= dtBegin & e.ErrorDate <= dtEnd & e.Type.Contains(strType)
                                 orderby e.IDSys
                                 select new
                                 {
                                     e.IDSys,
                                     e.ErrorName,
                                     e.Description,
                                     e.ErrorDate,
                                     e.UserIDSys,
                                     e.Type,
                                     e.ModuleName
                                 }).ToList().Select(d => new SYS_Error()
                                 {
                                     IDSys = d.IDSys,
                                     ErrorName = d.ErrorName,
                                     Description = d.Description,
                                     ErrorDate = d.ErrorDate,
                                     UserIDSys = d.UserIDSys,
                                     Type = d.Type,
                                     ModuleName = d.ModuleName
                                 });

                    lstError = Error.Skip((intPageNumber - 1) * intPageSize).Take(intPageSize).ToList();
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SelectData, "Lấy danh sách lỗi", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Error --> SelectToList");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy danh sách lỗi thành công", string.Empty);
        }


        #endregion
    }
}
